import { MockMethod } from 'vite-plugin-mock'

const article_list: any = []
const count = 100

for (let i = 0; i < count; i++) {
  article_list.push({
    id: i,
    timestamp: new Date().getTime(),
    author: `Author ${i}`,
    reviewer: `reviewer ${i}`,
    title: `Title ${i}`,
    importance: Math.floor(Math.random() * 3) + 1,
    type: ['CN', 'US', 'JP', 'EU'][Math.floor(Math.random() * 4)],
    status: ['published', 'draft'][Math.floor(Math.random() * 2)],
    display_time: new Date().toISOString(),
    pageviews: Math.floor(Math.random() * (5000 - 300)) + 300,
    remark: `remark ${i}`
  })
}

export default [
  {
    url: '/api/v1/article/list',
    timeout: 200,
    method: 'get',
    response: ({ query }) => {
      const { importance, type, title, page = 1, limit = 10, sort } = query
      let mock_list = article_list.filter((item: any) => {
        if (importance && item.importance !== +importance) return false
        if (type && item.type !== type) return false
        if (title && item.title.indexOf(title) < 0) return false
        if (item.status === 'deleted') return false
        return true
      })
      if (sort === '-id') {
        mock_list = mock_list.reverse()
      }
      const page_list = mock_list.filter(
        (item: any, index: number) =>
          index < limit * page && index >= limit * (page - 1)
      )

      return {
        code: '00000',
        data: { total: mock_list.length, page: page, items: page_list },
        msg: '一切ok'
      }
    }
  },
  {
    url: '/api/v1/article/detail',
    timeout: 200,
    method: 'get',
    response: ({ query }) => {
      const { id } = query
      for (const article of article_list) {
        if (article.id === +id) {
          return {
            code: '00000',
            data: article,
            msg: '一切ok'
          }
        }
      }
    }
  },
  {
    url: '/api/v1/article/pv',
    timeout: 200,
    method: 'get',
    response: ({ query }) => {
      const { id } = query
      for (const article of article_list) {
        if (article.id === +id) {
          return {
            code: '00000',
            data: {
              pv: article.pageviews,
              pvData: [
                { key: 'PC', pv: 1024 },
                { key: 'mobile', pv: 1024 },
                { key: 'ios', pv: 1024 },
                { key: 'android', pv: 1024 }
              ]
            },
            msg: '一切ok'
          }
        }
      }
    }
  },
  {
    url: '/api/v1/article/update',
    timeout: 200,
    method: 'post',
    response: ({ body }) => {
      const { id, ...updatedFields } = body
      // 查找要更新的文章
      const articleToUpdate = article_list.find(
        (article: any) => article.id === id
      )

      // 如果找到了要更新的文章
      if (articleToUpdate) {
        // 使用 Object.assign 方法更新文章
        Object.assign(articleToUpdate, updatedFields)
        return {
          code: '00000',
          data: {
            article: articleToUpdate
          },
          msg: '一切ok'
        }
      } else {
        console.error(`Article with id ${id} not found.`)
      }
    }
  },
  {
    url: '/api/v1/article/create',
    timeout: 200,
    method: 'post',
    response: ({ body }) => {
      const { title, author, importance, type, status, remark, timestamp } =
        body
      // article_list最大的id值;
      const maxId = article_list.reduce((maxId: number, article: any) => {
        return Math.max(maxId, article.id)
      }, -1)
      const article = {
        id: maxId + 1,
        timestamp,
        author,
        reviewer: `reviewer ${maxId + 1}`,
        title,
        importance,
        type,
        status,
        display_time: new Date(timestamp).toISOString(),
        pageviews: Math.floor(Math.random() * (5000 - 300)) + 300,
        remark
      }
      article_list.push(article)
      return {
        code: '00000',
        data: {
          article
        },
        msg: '一切ok'
      }
    }
  },
  {
    url: '/api/v1/article/delete',
    timeout: 200,
    method: 'post',
    response: ({ body }) => {
      const { id } = body
      const index = article_list.findIndex((article: any) => article.id === id)
      article_list.splice(index, 1)
      return {
        code: '00000',
        msg: '一切ok'
      }
    }
  }
] as MockMethod[]
